#pragma once

#include "ITabla.h"
#include "Puntero.h"
#include "Comparador.h"
#include "Array.h"
#include "Lista.h"
#include "NodoTablaHashAbierto.h"
#include "FuncionHash.h"
#include "Tupla.h"
 

template <class C,class V>
class TablaHash : public ITabla<C,V>
{
public:

	TablaHash(Puntero<Comparador<C>> comparador, Puntero<FuncionHash<C>> funcionHash, nat largo);

	/* inserta la pareja con clave x y valor y */
	void Insertar(const C x, const V y);

	/* dado una calve devuelve el valor asosciado */
	/* Pre la calve esta definida en la tabla */
	V Recuperar(const C x) const;
		
	/* retorna true si x es clave en la tabla */
	bool EstaDefinido(const C x) const;

	/* Actualiza el valor en la tabla */
	void ActualizarValor(const C& x, const V& y);
	 
private:
	
	Array<Puntero<NodoTablaHashAbierto<C,V>>> tabla;
	Puntero<Comparador<C>> comparadorClave;
	Puntero<FuncionHash<C>> funcionHash;
	int largo;
	int cantElementos;

	int PrimoMasCercano(int numero)
	{
		return numero;
	}
};

#include "TablaHash.cpp"